"""
判断线程是否已经启动

问题：
   你已经启动了一个线程，但是你想知道它是不是真的已经开始运行了。
解决方案：
    线程的一个关键特性是每个线程都是独立运行且状态不可预测。
    如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作，这时线程同步问题就会变得非常棘手。
    为了解决这些问题，我们需要使用 threading 库中的 Event 对象。
    Event 对象包含一个可由线程设置的信号标志，它允许线程等待某些事件的发生。
    在初始情况下，event 对象中的信号标志被设置为假。
    如果有线程等待一个 event 对象，而这个 event 对象的标志为假，那么这个线程将会被一直阻塞直至该标志为真。
    一个线程如果将一个 event 对象的信号标志设置为真，它将唤醒所有等待这个 event 对象的线程。
    如果一个线程等待一个已经被设置为真的 event 对象，那么它将忽略这个事件，继续执行。
"""

import time
from threading import Event, Thread


def get_html(n, start_event):
    print("get_html started")
    start_event.set()

    while n > 0:
        print("get_html ", n)
        n -= 1
        time.sleep(3)


def use_event():
    # event 对象最好单次使用，就是说，你创建一个 event 对象，让某个线程等待这个对象，一旦这个对象被设置为真，你就应该丢弃它。
    start_event = Event()
    print("加载 get_html")

    t = Thread(target=get_html, args=(3, start_event))
    t.start()

    # 等待线程启动
    start_event.wait()
    print("get_html is running")
    t.join()


if __name__ == '__main__':
    use_event()
